package demo01;

public class Person /* extends Object */ {
    private String name;
    private int age;

    // 源代码操作 -> Generate toSring()：自动生成toSring重写方法
    @Override
    public String toString() {
        return "Person [age=" + age + ", name=" + name + "]";
    }

    /*
     *  Object类的equals方法默认比较的是两个对象的地址值，没有意义
     *  所以需要重写equals方法，比较两个对象的属性值(name,age)
     *      对象的属性值一样，则返回true；否则返回false
     *  问题：
     *      在调用方法时，可以发现其中隐含了多态性
     *      方法参数类型：Object obj = person2 = new Person("粹花", 1);
     *      多态的弊端：无法使用子类特有的内容(属性,方法)
     *      解决方法：使用向下转型(强转)把Object类型转换为Person类型
     */
    // 源代码操作 -> Generate hashCode() and equals()：自动生成equals重写方法(vscode默认生成的样式如下)
    @Override
    public boolean equals(Object obj) {
        if (this == obj) // 增加判断，传递的参数obj如果是this本身，直接返回true，提高程序效率
            return true;
        if (obj == null) // 增加判断，传递的参数obj如果是null，直接返回false，提高程序的效率
            return false;

        // 此处的判断语句使用了反射技术，判断obj是否为Person类型，等效于：obj instanceof Person （使用instanceof关键字判断对象obj原本是不是属于Person类）
        if (getClass() != obj.getClass()) // 增加判断，如果obj是Person类型再进行转换，防止类型转换异常ClassCastException
            return false; 

        Person other = (Person) obj; // 使用向下转型(强转)把Object类型转换为Person类型
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;

        // 比较两个对象的属性：对象一是调用方法的this(person1)，对象二是other(obj=person2)
        } else if (!name.equals(other.name)) // 字符串的equals重写过，比较的是其内容，结果使用!取反，判断两字符串是否为不相等
            return false;

        return true;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
